#!/bin/bash

# Node-RED 安装脚本 - 增强版，处理常见的系统包冲突问题

# 设置非交互模式
export DEBIAN_FRONTEND=noninteractive
export DEBCONF_NONINTERACTIVE_SEEN=true

# 颜色输出函数
print_info() {
    echo -e "\033[34m[INFO]\033[0m $1"
}

print_success() {
    echo -e "\033[32m[SUCCESS]\033[0m $1"
}

print_error() {
    echo -e "\033[31m[ERROR]\033[0m $1"
}

print_warning() {
    echo -e "\033[33m[WARNING]\033[0m $1"
}

# 预处理包问题
fix_package_issues() {
    print_info "预处理可能的包配置问题..."
    
    # 终止可能正在运行的进程
    sudo pkill -f "apt-get\|dpkg\|unattended-upgrade" 2>/dev/null || true
    
    # 清理锁文件
    sudo rm -f /var/lib/dpkg/lock-frontend /var/lib/dpkg/lock /var/cache/apt/archives/lock 2>/dev/null || true
    
    # 预配置 initramfs-tools
    echo 'initramfs-tools initramfs-tools/driver_policy select most' | sudo debconf-set-selections 2>/dev/null || true
    
    # 重新配置可能有问题的包
    sudo dpkg --configure -a --force-confdef --force-confold 2>/dev/null || true
    
    print_success "包问题预处理完成"
}

# 预处理包问题
fix_package_issues

# 更新系统包
print_info "正在更新系统包列表..."
sudo apt-get clean
if sudo apt-get update; then
    print_success "系统包列表更新成功"
else
    print_warning "系统包列表更新有警告，继续安装..."
fi

# 安装 Node.js 和 npm（改进版）
install_nodejs_npm() {
    print_info "正在安装Node.js和npm..."
    
    # 方法1: 尝试从 NodeSource 安装
    print_info "尝试方法1: NodeSource 官方源..."
    if curl -fsSL https://deb.nodesource.com/setup_18.x | sudo -E bash - 2>/dev/null; then
        if sudo apt-get install -y nodejs 2>/dev/null; then
            print_success "Node.js 通过 NodeSource 安装成功"
            return 0
        fi
    fi
    
    print_warning "NodeSource 安装失败，尝试系统包管理器..."
    
    # 方法2: 使用系统包管理器
    print_info "尝试方法2: 系统包管理器..."
    if sudo apt-get install -y nodejs npm 2>/dev/null; then
        print_success "Node.js 通过系统包管理器安装成功"
        return 0
    else
        print_error "Node.js 安装失败"
        return 1
    fi
}

# 执行 Node.js 安装
if ! install_nodejs_npm; then
    print_error "Node.js 安装失败，退出安装"
    exit 1
fi

# 验证Node.js和npm安装
print_info "验证Node.js和npm版本..."
if command -v node >/dev/null 2>&1 && command -v npm >/dev/null 2>&1; then
    echo "Node.js 版本: $(node -v)"
    echo "npm 版本: $(npm -v)"
    print_success "Node.js 和 npm 验证成功"
else
    print_error "Node.js 或 npm 未正确安装"
    exit 1
fi

# 设置npm代理
print_info "正在设置npm代理..."
npm config set registry https://registry.npmmirror.com
print_success "npm 代理设置完成"

# 安装Node-RED
print_info "正在安装Node-RED..."
if sudo npm install -g --unsafe-perm node-red 2>/dev/null; then
    print_success "Node-RED 安装成功"
else
    print_error "Node-RED 安装失败"
    exit 1
fi

# 安装Node-RED管理工具
print_info "正在安装Node-RED管理工具..."
if sudo npm install -g --unsafe-perm node-red-admin 2>/dev/null; then
    print_success "Node-RED 管理工具安装成功"
else
    print_warning "Node-RED 管理工具安装失败（不影响主要功能）"
fi

# 设置Node-RED开机自启
print_info "正在设置Node-RED开机自启..."

# 创建systemd服务文件
sudo tee /etc/systemd/system/node-red.service > /dev/null << 'EOF'
[Unit]
Description=Node-RED
After=syslog.target network.target

[Service]
ExecStart=/usr/bin/node-red --max-old-space-size=128 --userDir /root/.node-red
Restart=on-failure
KillSignal=SIGINT

# log output to syslog as 'node-red'
SyslogIdentifier=node-red
StandardOutput=syslog

# non-root user to run as
WorkingDirectory=/root/

User=root
Group=root

[Install]
WantedBy=multi-user.target
EOF

# 重新加载systemd配置
sudo systemctl daemon-reload

# 启用Node-RED服务
sudo systemctl enable node-red

# 启动Node-RED服务
sudo systemctl start node-red

# 检查服务状态
if sudo systemctl is-active --quiet node-red; then
    print_success "Node-RED 服务启动成功"
    print_info "Node-RED 访问地址: http://localhost:1880"
    print_info "查看服务状态: sudo systemctl status node-red"
    print_info "查看服务日志: journalctl -u node-red -f"
else
    print_error "Node-RED 服务启动失败"
    print_info "请检查日志: journalctl -u node-red -e"
    exit 1
fi

print_success "Node-RED 安装和配置完成！"
